#ifndef __AHUDATA_H__
#define __AHUDATA_H__

#include "ahupid.h"
#include "datacpy.h"
#include "ahufsm.h"
#include "ahulist.h"
#include "es_print.h"
#include <unistd.h>
#include "ahumqtt.h"
#include "ahulist.h"
#include <stdbool.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <string.h>
#include <pthread.h>
#include <mosquitto.h>
#include <math.h>
#include <json-c/json_util.h>
#include <json-c/json.h>

#define APPNAME "AHU"

/* 消息队列buf, 目前只用于事件的收发 */
typedef struct _ahu_msg_t{
	long    mtype;
    int     fsmevt;         // 状态机事件
    char    device_id[30];  // 设备ID
	char    data[1024];     // 备用
}ahu_msg_t;

/* 消息队列类型 */
typedef enum _ahu_msg_tp_e{
	AHU_MQTP_EVENT = 1          // 消息队列的类型不能==0
}ahu_msg_tp_e;

/* 空调设备描述符 */
typedef struct _ahu_dev_t{
    pthread_mutex_t lock;

    char device_id[30];     // 虚点的deviceKey作为当前空调的id
    bool add_dev;           // true: 设备添加完成

    point_prop_t *vp;       // 指向所有的虚点，每解析一个点位就用reclloc扩增一断point_prop_t大小的内存
    point_prop_t *rp;       // 实点，每解析一个点位就用reclloc扩增一断point_prop_t大小的内存

    unsigned int vir_num;       // 虚点个数
    unsigned int real_num;      // 实点个数
    unsigned int points_num;    // 点位总数 real_num+vir_num

    ahu_fsm_t fsm;              // 状态机

    char tmr_sf_onwait[64];     // 保存定时器name (风机开等待检查定时器)
    char tmr_sf_offwait[64];    // 保存定时器name (风机关等待检查定时器)

    bool old_st_startup;        // 保留上次启停状态，用于判断新启停状态是否发生变化

    ahupid_set_t pidset;        // pid描述符集合

    struct list_head list;
}ahu_dev_t;

enum error_code read_rp_byname(ahu_dev_t *ahu_dev, char *name, data_type_u *val);
enum error_code read_vp_byname(ahu_dev_t *ahu_dev, char *name, data_type_u *val);

enum error_code set_cmdpoint_ifexist(char *name, ahu_dev_t *ahu_dev, data_type_u val, enum type_of_val tp);
void combine_string(char *dest, char *src1, char *src2);

double *get_double_ptr_by_name(char *name, ahu_dev_t *ahu_dev);

bool is_point_exist(ahu_dev_t *ahu_dev, char *name);

#endif //__AHUDATA_H__